package org.shoukaiseki.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 *
 **/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    
    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    public static final Long lastDateMilliseconds=3742732800000L;

    //允许的时间最大值,这里
    public static final Date lastDate=new Date(3742732800000L);

    //使用int作为排序字段时,排允许的时间最大值
    public static final Date sortLastDate=new Date(2096888674000L);

    public static final String formatToStr(final Date date) {
        return formatToStr(YYYY_MM_DD_HH_MM_SS, date);
    }

    public static final String formatToStr(final String format, final Date date)
    {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str)
    {
        if (str == null)
        {
            return null;
        }
        try
        {
            return parseDate(str.toString(), parsePatterns);
        }
        catch (ParseException e)
        {
            return null;
        }
    }


    /**
     * 取最大值,null是最小值
     * @param date1
     * @param date2
     * @return  最大值或者null
     */
    public static Date maxNullIsMin(Date date1,Date date2){
        if(date1==null){
            return date2;
        }
        if(date2==null){
            return date1;
        }
        if (date1.compareTo(date2)>0) {
            return date1;
        }
        return date2;
    }



    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate()
    {
        return new Date();
    }


    /**
     * <pre>
     * d1 是否小于 d2
     * 如果两个都为null        false
     * null作为最小值处理      false
     * </pre>
     * @param d1
     * @param d2
     * @return
     */
    public static boolean isLess(Date d1,Date d2){
        return compareToNullIsMinDate(d1,d2)==-1?true:false;
    }

    /**
     * d1是否大于d2,为null则当作0处理
     * @param d1
     * @param d2
     * @return   {@code true:d1>d2  false:d1<=d2}
     */
    public static boolean isGreater(Date d1,Date d2){
        return compareToNullIsMinDate(d1,d2)==1?true:false;
    }


    /**
     * 比较,如果为null则当作 date 最小值处理
     * @param d1
     * @param d2
     * @return   {@code -1:d1<d2, 0: d1=d2 1:d1>d2 }
     */
    public static int compareToNullIsMinDate(Date d1,Date d2){
        if(d1==d2){
            return 0;
        }

        if(d1==null){
            return -1;
        }
        if(d2==null){
            return 1;
        }
        return d1.compareTo(d2);
    }



    //某天开始时间
    public static Date dayFirstTime(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY,0);
        cal.set(Calendar.MINUTE,0);
        cal.set(Calendar.SECOND,0);
        cal.set(Calendar.MILLISECOND,0);
        return cal.getTime();
    }



    //某天结束时间 23:59:59
    public static Date dayEndTime(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY,23);
        cal.set(Calendar.MINUTE,59);
        cal.set(Calendar.SECOND,59);
        cal.set(Calendar.MILLISECOND,59);
        return cal.getTime();
    }
}
